package cn.itcast.bos.web.action.common;

import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;

import org.apache.struts2.ServletActionContext;
import org.springframework.data.domain.Page;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
	
	protected T model;
	
	/**
	 * 泛型T:代表任意类型（字符串数字对象）
	 * BaseAction<Standard>：参数化类型(Class)
	 * 父类BaseAction<>尖括号里class:实际类型参数  
	 */
	public T getModel() {
		return model;
	}
	
	
	//子类Action对象创建，父类无参构造执行。在无参构造中获取实际类型参数
	public BaseAction() {
		try {
			//第一步：获取子类class--- cn.itcast.bos.web.action.base.StandardAction     this代表子类
			Class clazz = this.getClass();
			System.out.println(clazz);
			//第二步：获取父类class----cn.itcast.bos.web.action.common.BaseAction<cn.itcast.bos.domain.base.Standard>
			/*Type getGenericSuperclass() 
				返回表示此 Class 所表示的实体（类、接口、基本类型或 void）的直接超类的 Type。 */
			Type type = clazz.getGenericSuperclass();
			System.out.println(type);
			
			//将Type接口转为子接口： ParameterizedType
			ParameterizedType parameterizedType=(ParameterizedType) type;
			//第三步：获取实际类型参数
			Type[] types = parameterizedType.getActualTypeArguments();//[cn.itcast.bos.domain.base.Standard]
			//将Type转为实现类
			Class clazzzzzzzzzzzzzz =(Class) types[0];
			//第四步：将实际类型（class）参数实例化
			model=(T) clazzzzzzzzzzzzzz.newInstance();
			System.out.println(model);
		}  catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	//通过属性驱动接收页面提交当前页，每页显示记录数
	protected int page;
	protected int rows;
	public void setPage(int page) {
		this.page = page;
	}
	public void setRows(int rows) {
		this.rows = rows;
	}
	
	
	/**
	  * @Description: 将page结果转为分页查询json
	  * 将java对象转为json字符串
	  * @param page ：分页查询结果
	  * @param excludes :转json排除属性
	 */
	public void java2Json(Page<T> page,String[] excluds){
		try {
			//将java对象转为json
			//常见转json工具包：json-lib ，fastjson， gson，jackson
			//数组类型json格式 JsonArray.fromObject(数组或者list集合)
			//对象形式的json格式 JsonObject.fromObject(javaBean或者map集合)
			Map<String, Object> map=new HashMap<>();
			map.put("total", page.getTotalElements());
			map.put("rows", page.getContent());
			//将实体中 不需要转json属性排除掉(fixedAreas集合属性引起noSession故排除)
			JsonConfig jsonConfig=new JsonConfig();
			jsonConfig.setExcludes(excluds);
			String json=JSONObject.fromObject(map,jsonConfig).toString();
			System.err.println(json);
			ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
			ServletActionContext.getResponse().getWriter().write(json);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	
	/**
	 * @Description:ajax请求,查询所有收派记录                                                                                                                                       
	 * @return  json数组
	 * @throws Exception
	 */
	public void java2Json(List list,String[] excluds){
		try {
			//将实体中 不需要转json属性排除掉(fixedAreas集合属性引起noSession故排除)
			JsonConfig jsonConfig=new JsonConfig();
			jsonConfig.setExcludes(excluds);
			String json=JSONArray.fromObject(list,jsonConfig).toString();
			System.err.println(json);
			ServletActionContext.getResponse().setContentType("text/json;charset=utf-8");
			ServletActionContext.getResponse().getWriter().write(json);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	
	

}
